"""
SCL-90心理健康量表算法实现

包含总分计算、平均分计算、风险评估等核心算法
"""
from typing import Dict, List, Tuple
from .models import SCLAnswers, BasicInfo


class SCL90Algorithm:
    """SCL-90算法实现类"""
    
    @classmethod
    def calculate_total_score(cls, scl_answers: SCLAnswers) -> int:
        """
        计算SCL-90总分
        
        Args:
            scl_answers: SCL-90问卷答案
            
        Returns:
            int: 总分 (90-450分)
        """
        total_score = 0
        
        for question_id in range(1, 91):
            score = scl_answers.get_score(str(question_id))
            if score > 0:  # 有效分数 (1-5)
                total_score += score
        
        return total_score
    
    @classmethod
    def calculate_average_score(cls, total_score: int) -> float:
        """
        计算SCL-90平均分
        
        Args:
            total_score: 总分
            
        Returns:
            float: 平均分 (1.0-5.0)
        """
        return round(total_score / 90.0, 2)
    
    @classmethod
    def get_risk_level(cls, total_score: int) -> str:
        """
        根据总分确定风险等级
        
        Args:
            total_score: 总分 (90-450)
            
        Returns:
            str: 风险等级
        """
        if total_score <= 180:
            return '正常'
        elif total_score <= 270:
            return '轻度困扰'
        elif total_score <= 360:
            return '中度困扰'
        elif total_score <= 405:
            return '较重困扰'
        else:
            return '严重困扰'
    
    @classmethod
    def get_interpretation(cls, total_score: int) -> str:
        """
        根据总分获取心理状态解读
        
        Args:
            total_score: 总分
            
        Returns:
            str: 心理状态解读
        """
        if total_score <= 180:
            return "✅ 正常，情绪稳定、心理状态良好，无明显困扰"
        elif total_score <= 270:
            return "⚠️ 轻度困扰，可能有部分压力或不适，建议适当调节情绪"
        elif total_score <= 360:
            return "❗️中度困扰，明显困扰，建议重视心理调节，可考虑咨询"
        elif total_score <= 405:
            return "❗️较重困扰，情绪状态较差，日常功能可能受影响，建议咨询专业人士"
        else:
            return "🚨 严重困扰，情绪压力非常大，强烈建议寻求心理帮助或干预"
    
    @classmethod
    def generate_basic_analysis(cls, total_score: int, average_score: float, basic_info: BasicInfo) -> str:
        """
        生成基础分析报告
        
        Args:
            total_score: 总分
            average_score: 平均分
            basic_info: 基本信息
            
        Returns:
            str: 分析报告文本
        """
        risk_level = cls.get_risk_level(total_score)
        interpretation = cls.get_interpretation(total_score)
        
        # 分析报告模板
        report_parts = []
        
        # 总体评估
        report_parts.append(f"## 总体心理健康状况评估\n")
        report_parts.append(f"您的SCL-90总分为 **{total_score}** 分\n")
        report_parts.append(f"平均分为 **{average_score}** 分\n")
        report_parts.append(f"心理状态：**{interpretation}**\n")
        
        # 个性化建议
        report_parts.append(f"## 个性化建议\n")
        suggestions = cls._generate_personalized_suggestions(total_score, basic_info)
        report_parts.append(suggestions)
        
        return "\n".join(report_parts)

    @classmethod
    def generate_enhanced_basic_analysis(cls, total_score: int, average_score: float, basic_info: BasicInfo) -> str:
        """
        生成增强版基础分析报告（当AI不可用时的备选方案）
        
        Args:
            total_score: 总分
            average_score: 平均分
            basic_info: 基本信息
            
        Returns:
            str: 增强版分析报告文本
        """
        risk_level = cls.get_risk_level(total_score)
        interpretation = cls.get_interpretation(total_score)
        
        # 分析报告模板
        report_parts = []
        
        # 总体评估
        report_parts.append(f"## 📊 总体心理健康状况评估\n")
        report_parts.append(f"您的SCL-90总分为 **{total_score}** 分（总分范围：90-450分）\n")
        report_parts.append(f"平均分为 **{average_score}** 分（平均分范围：1.0-5.0分）\n")
        report_parts.append(f"心理状态：**{interpretation}**\n")
        
        # 详细分析
        report_parts.append(f"## 🔍 详细分析\n")
        
        # 基于分数的详细解读
        if total_score <= 180:
            report_parts.append("您的评估结果显示心理状态整体良好，各项指标均在正常范围内。这表明您目前能够较好地应对日常生活中的压力和挑战。")
        elif total_score <= 270:
            report_parts.append("您的评估结果显示存在轻度的心理困扰。这是一个常见的状况，可能与生活压力、工作学习负担或人际关系等因素有关。")
            report_parts.append("需要注意的是，轻度困扰如果不及时调节，可能会逐渐发展为更严重的心理问题。")
        elif total_score <= 360:
            report_parts.append("您的评估结果显示存在中度的心理困扰，这已经对您的日常生活产生了一定影响。")
            report_parts.append("中度困扰通常表现为情绪波动较大、注意力难以集中、睡眠质量下降等症状。")
            report_parts.append("建议您认真对待这种状况，积极寻求改善方法。")
        elif total_score <= 405:
            report_parts.append("您的评估结果显示存在较重的心理困扰，这种状况需要引起高度重视。")
            report_parts.append("较重困扰可能严重影响您的工作效率、人际关系和生活质量。")
            report_parts.append("强烈建议您寻求专业心理健康服务的帮助。")
        else:
            report_parts.append("您的评估结果显示存在严重的心理困扰，这是一个需要立即处理的紧急状况。")
            report_parts.append("严重困扰可能导致功能性障碍，影响您的基本生活能力。")
            report_parts.append("请立即寻求专业心理健康服务或医疗帮助。")
        
        # 个性化因素分析
        report_parts.append(f"\n## 🎯 个性化因素分析\n")
        
        # 年龄因素
        age_analysis = cls._get_age_analysis(basic_info.age, total_score)
        if age_analysis:
            report_parts.append(f"**年龄因素：** {age_analysis}")
        
        # 职业因素  
        occupation_analysis = cls._get_occupation_analysis(basic_info.occupation, total_score)
        if occupation_analysis:
            report_parts.append(f"**职业因素：** {occupation_analysis}")
        
        # 睡眠因素
        sleep_analysis = cls._get_sleep_analysis(basic_info.sleep_condition, total_score)
        if sleep_analysis:
            report_parts.append(f"**睡眠状况：** {sleep_analysis}")
        
        # 改善建议
        report_parts.append(f"\n## 💡 改善建议\n")
        suggestions = cls._generate_enhanced_suggestions(total_score, basic_info)
        report_parts.append(suggestions)
        
        # 注意事项
        report_parts.append(f"\n## ⚠️ 重要提醒\n")
        report_parts.append("- 本评估结果仅供参考，不能替代专业医疗诊断")
        report_parts.append("- 如果您感到情绪严重困扰或有自我伤害倾向，请立即寻求专业帮助")
        report_parts.append("- 心理健康状况会随时间变化，建议定期进行自我评估")
        
        return "\n".join(report_parts)
    
    @classmethod
    def _get_age_analysis(cls, age: str, total_score: int) -> str:
        """基于年龄的分析"""
        if age in ['18岁以下']:
            return "青少年期是心理发展的关键阶段，情绪波动较为常见。建议关注学习压力管理和情绪调节能力的培养。"
        elif age in ['18-25岁']:
            return "青年早期面临学业、就业、恋爱等多重压力，心理困扰往往与适应性问题相关。建议加强心理韧性训练。"
        elif age in ['26-35岁']:
            return "这个年龄段通常面临职业发展和家庭建立的双重压力，需要平衡多种角色和责任。"
        elif age in ['36-45岁']:
            return "中年期可能面临职业瓶颈、家庭责任和健康担忧，建议关注工作生活平衡和压力管理。"
        elif age in ['46-55岁']:
            return "中年后期需要面对身体变化、职业转换和家庭变化，建议培养新的兴趣爱好和社交圈子。"
        else:
            return "建议保持积极的生活态度，多参与社交活动，关注身心健康的综合维护。"
    
    @classmethod
    def _get_occupation_analysis(cls, occupation: str, total_score: int) -> str:
        """基于职业的分析"""
        if occupation == '学生':
            return "学生群体常面临学业压力、就业焦虑和人际关系问题。建议合理安排学习时间，培养多样化的兴趣爱好。"
        elif occupation in ['医护人员', '教师']:
            return "助人职业容易出现职业倦怠和情感耗竭。建议注意自我关怀，建立专业支持网络。"
        elif occupation in ['企业员工', '公务员']:
            return "职场人员需要应对工作压力、人际竞争和职业发展压力。建议培养工作外的兴趣爱好，保持工作生活平衡。"
        elif occupation == '个体经营':
            return "创业和个体经营面临较大的经济和心理压力。建议建立风险管理意识，寻求同业支持。"
        elif occupation == '退休人员':
            return "退休后需要适应生活方式的重大变化。建议培养新的兴趣爱好，保持社交活动。"
        else:
            return "每种职业都有其特定的压力源，建议识别并积极应对职业相关的心理压力。"
    
    @classmethod  
    def _get_sleep_analysis(cls, sleep_condition: str, total_score: int) -> str:
        """基于睡眠状况的分析"""
        if sleep_condition == '睡眠质量很好':
            return "良好的睡眠质量有助于心理健康的维护，请继续保持规律的作息习惯。"
        elif sleep_condition == '偶尔失眠':
            return "偶尔失眠通常与压力事件相关，建议学习放松技巧，如深呼吸、冥想等。"
        elif sleep_condition == '经常失眠':
            return "经常失眠严重影响心理健康，可能形成恶性循环。建议改善睡眠环境，建立规律作息。"
        elif sleep_condition == '严重失眠':
            return "严重失眠需要专业干预，可能需要结合心理治疗和医疗手段。建议尽快咨询专业人士。"
        else:
            return "药物依赖性睡眠需要谨慎对待，建议在专业指导下逐步改善睡眠习惯。"
    
    @classmethod
    def _generate_enhanced_suggestions(cls, total_score: int, basic_info: BasicInfo) -> str:
        """生成增强版建议"""
        suggestions = []
        
        # 基于风险等级的核心建议
        if total_score <= 180:
            suggestions.extend([
                "**保持现状：** 继续维持良好的心理状态和生活习惯",
                "**预防为主：** 学习压力管理技巧，建立应对困难的心理资源",
                "**定期自检：** 定期进行心理健康自我评估，及时发现问题"
            ])
        elif total_score <= 270:
            suggestions.extend([
                "**压力管理：** 学习有效的压力应对策略，如时间管理、放松训练等",
                "**情绪调节：** 培养积极的情绪调节能力，如运动、音乐、阅读等",
                "**社交支持：** 主动寻求家人朋友的理解和支持，不要独自承担压力"
            ])
        elif total_score <= 360:
            suggestions.extend([
                "**专业咨询：** 建议寻求专业心理咨询师的帮助，学习更有效的应对策略",
                "**生活调整：** 适当调整生活节奏，减少非必要的压力源",
                "**健康管理：** 注意身体健康，规律运动和饮食有助于心理状态改善"
            ])
        elif total_score <= 405:
            suggestions.extend([
                "**立即求助：** 强烈建议立即寻求专业心理健康服务",
                "**医疗评估：** 考虑进行更全面的心理健康评估，必要时寻求医疗帮助",
                "**安全支持：** 确保有可靠的支持系统，避免独处时间过长"
            ])
        else:
            suggestions.extend([
                "**紧急干预：** 请立即寻求专业心理健康服务或医疗帮助",
                "**危机热线：** 如有紧急情况，请拨打心理危机干预热线：400-161-9995",
                "**持续关注：** 需要密切关注心理状态变化，避免独自面对困难"
            ])
        
        # 个性化建议
        personal_suggestions = cls._generate_personalized_suggestions(total_score, basic_info)
        if personal_suggestions:
            suggestions.append("**个性化建议：**")
            suggestions.extend(personal_suggestions.split('\n'))
        
        return '\n'.join(suggestions)
        """
        生成基础分析报告
        
        Args:
            total_score: 总分
            average_score: 平均分
            basic_info: 基本信息
            
        Returns:
            str: 分析报告文本
        """
        risk_level = cls.get_risk_level(total_score)
        interpretation = cls.get_interpretation(total_score)
        
        # 分析报告模板
        report_parts = []
        
        # 总体评估
        report_parts.append(f"## 总体心理健康状况评估\n")
        report_parts.append(f"您的SCL-90总分为 **{total_score}** 分\n")
        report_parts.append(f"平均分为 **{average_score}** 分\n")
        report_parts.append(f"心理状态：**{interpretation}**\n")
        
        # 个性化建议
        report_parts.append(f"## 个性化建议\n")
        suggestions = cls._generate_personalized_suggestions(total_score, basic_info)
        report_parts.append(suggestions)
        
        return "\n".join(report_parts)
    
    @classmethod
    def _generate_personalized_suggestions(cls, total_score: int, basic_info: BasicInfo) -> str:
        """生成个性化建议"""
        suggestions = []
        
        # 基于年龄的建议
        if basic_info.age in ['18岁以下', '18-25岁']:
            suggestions.append("- 作为年轻人，建议培养健康的生活习惯和应对压力的能力")
        elif basic_info.age in ['26-35岁', '36-45岁']:
            suggestions.append("- 处于人生重要阶段，建议平衡工作与生活，注意心理健康")
        else:
            suggestions.append("- 建议保持积极的生活态度，多参与社交活动")
        
        # 基于职业的建议
        if basic_info.occupation in ['学生']:
            suggestions.append("- 学习压力可能较大，建议合理安排学习和休息时间")
        elif basic_info.occupation in ['医护人员', '教师']:
            suggestions.append("- 从事助人职业，注意预防职业倦怠，关注自身心理健康")
        elif basic_info.occupation in ['企业员工', '公务员']:
            suggestions.append("- 工作压力需要合理管理，建议培养业余爱好缓解压力")
        
        # 基于睡眠状况的建议
        if basic_info.sleep_condition != '睡眠质量很好':
            suggestions.append("- 睡眠质量影响心理健康，建议改善睡眠习惯或寻求医疗帮助")
        
        # 基于总分的建议
        if total_score <= 180:
            suggestions.append("- 继续保持良好的心理状态，注意日常压力管理")
        elif total_score <= 270:
            suggestions.append("- 建议关注心理健康，学习压力管理技巧，必要时寻求专业指导")
        elif total_score <= 360:
            suggestions.append("- 建议尽快寻求专业心理咨询，学习有效的应对策略")
        elif total_score <= 405:
            suggestions.append("- 强烈建议立即寻求专业心理健康服务，必要时寻求医疗帮助")
        else:
            suggestions.append("- 强烈建议立即寻求专业心理健康服务，必要时寻求医疗帮助")
            suggestions.append("- 如有紧急情况，请拨打心理危机干预热线：400-161-9995")
        
        return "\n".join(suggestions)
    
    @classmethod
    def generate_recommendations(cls, total_score: int, basic_info: BasicInfo) -> str:
        """生成简化的建议"""
        risk_level = cls.get_risk_level(total_score)
        
        if risk_level == '正常':
            return "继续保持良好的心理状态，注意日常压力管理。"
        elif risk_level == '轻度困扰':
            return "建议关注心理健康，学习压力管理技巧，必要时寻求专业指导。"
        elif risk_level == '中度困扰':
            return "建议尽快寻求专业心理咨询，学习有效的应对策略。"
        elif risk_level == '较重困扰':
            return "强烈建议立即寻求专业心理健康服务，必要时寻求医疗帮助。"
        else:  # 严重困扰
            return "强烈建议立即寻求专业心理健康服务，必要时寻求医疗帮助。如有紧急情况，请拨打心理危机干预热线：400-161-9995" 